package contracts;

import services.BlocService;
import services.TerrainService;
import decorators.TerrainDecorator;

public class TerrainContract extends TerrainDecorator implements TerrainService {

	public TerrainContract(TerrainService delegate) {
		super(delegate);
	}

	/**
	 * checkInvariant() verifie si les invariants sont respectes
	 * pour le service Terrain, il n'y a pas d'invariants
	 */
	public void checkInvariant(){
		
	}
	
	@Override
	public BlocService getBloc(int colonne, int ligne) throws ContractException{
		//\pre getBloc(T,x,y) require (0<=x<getNombreColonnes(T)) and (0<=y<getNombreLignes(T))

		if(ligne >= getNombreLignes()){
			throw new PreconditionException("Valeur de ligne invalide : ligne >= "+getNombreLignes());
		}
		else if(ligne <0){
			throw new PreconditionException("Valeur de ligne invalide : ligne < 0 ");
		}
		else if(colonne >= getNombreColonnes()){
			throw new PreconditionException("Valeur de colonne invalide : colonne >= "+getNombreColonnes());
		}
		else if(colonne <0){
			throw new PreconditionException("Valeur de colonne invalide : colonne < 0 ");
		}
		
		return super.getBloc(colonne, ligne);
	}
	
	@Override
	public void init(int nbColonnes, int nbLignes) throws ContractException{
	    //pre init(X,Y) require X>= 1 and Y>= 1
		if(nbColonnes <1){
			throw new PreconditionException("Nombre de colonnes invalide < 1");
		}
		else if (nbLignes <1){
			throw new PreconditionException("Nombre de lignes invalide < 1");
		}
				
		super.init(nbColonnes, nbLignes);
		
		//\post getNombreColonnes(init(X,Y)) = X
		
		if(this.getNombreColonnes() != nbColonnes ){
			throw new PostconditionException("Le nombre de colonnes est different de celui passe en parametre");
		}
		
	    //\post getNombreLignes(init(X,Y)) = Y
		if(this.getNombreLignes() != nbLignes){
			throw new PostconditionException("Le nombre de lignes est different de celui passe en parametre");
		}
		     
	}
	
}
